#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>

//int main()
//{
//	printf("%zd", sizeof(short));
//	return 0;
//}


//自定义类型 —— 联合

//联合体类型的声明
//像结构体一样，联合体也是由一个或者多个成员构成，这些成员可以有不同的类型
//但是编译器 只 为最大的成员分配足够的内存空间。 
//联合体的特点是 所有的成员共用一块内存空间，所以联合体也叫共用体
//给联合体其中一个成员赋值，其他成员的值也会发生变化
//
//union Un
//{
//	char c;
//	int i;
//};
//
//int main()
//{
//	//联合变量的定义
//	union Un un = { 0 };
//	
//	//计算联合变量的大小
//
//	printf("%zd\n", sizeof(union Un));//4
//
//	return 0;
//}


//联合体的特点
//联合的成员是共用同一块内存空间的，这样一个联合变量的大小，至少（注意是至少）是最大成员的大小
//因为联合至少得有能力保存最大的那个成员

//union Un
//{
//	char c;
//	int i;
//};
//
//int main()
//{
//	union Un un = { 0 };
//
//	printf("un.i = %p\n", &(un.i));
//	printf("un.c = %p\n", &(un.c));
//	printf("un   = %p\n", &un);
//	//上面三行代码打印结果都相同
//	return 0;
//}

//union Un
//{
//	char c;
//	int i;
//};
//
//int main()
//{
//	union Un un = { 0 };
//	un.i = 0x11223344;
//	un.c = 0x55;
//	//由于联合体的性质特点，在修改c的时候会把i的值也修改
//	printf("%x\n", un.i);//%x是以16进制的形式打印的
//
//	return 0;
//}



//联合体的大小的计算
//注意：联合体的大小 至少 是最大成员的大小
//当最大成员大小不是最大对齐数的整数倍的时候，就要对齐到最大对齐数的整数倍


//union Un1
//{
//	char c[5];
//	int i;
//};
//
//union Un2
//{
//	short c[7];//sizeof(short) = 2
//	int i;
//};
//
//int main()
//{
//	printf("%zd\n", sizeof(union Un1));//8
//	printf("%zd\n", sizeof(union Un2));//16
//	return 0;
//}

//联合体是可以节省空间的
//举例
//如果用结构体
//struct gift_list
//{
//	//公共属性
//	int stock_number;//库存量
//	double price;//价格
//	int item_type;//商品类型
//
//	//特殊属性(不会同时使用)
//	
//	//书
//	char title[20];//书名
//	char author[20];//作者
//	int num_pages;//页数
//
//	//杯子
//	char design[30];//设计
//	
//	//衬衫
//	int color;//颜色
//	int sizes;//尺寸
//
//};
//用结构体实现，会很简单，也很方便，但是结构中包含了所有礼品的属性，这样会使结构体的大小偏大，比较浪费内存
//
//struct gift_list
//{
//	//公共属性
//	int stock_number;
//	double price;
//	int item_type;
//
//	//特殊属性(不会同时使用)
//	union
//	{
//		struct
//		{
//			char title[20];
//			char author[20];
//			int num_pages;
//		}book;
//
//		struct
//		{
//			char design[30];
//		}mug;
//
//		struct
//		{
//			char design[30];
//			int colors;
//			int sizes;
//		}shirt;
//	}item;
//};
//把公共属性单独写出来，剩余属于各种商品本身的属性使用联合体起来，就可以节省所需的内存空间，一定程度上节省了空间


//写一个程序，判断当前机器是大小端

//int check_sys()
//{
//	int i = 1;
//	//实现只访问i的第一个字节
//	return *(char*)&i;
//}

int check_sys()
{
	union
	{
		int i;
		char c;
	}un;
	un.i = 1;
	
	return un.c;//太beautiful的代码

}
int main()
{
	int ret = check_sys();
	if (ret == 1)
	{
		printf("xiao\n");
	}
	else
		printf("da\n");

	return 0;
}










